package jmcnet.libcommun.communs
{
	import flexunit.framework.Assert;
	import flexunit.framework.TestCase;
	import flexunit.framework.TestSuite;
	
	import jmcnet.libcommun.communs.exceptions.ErrorIllegalEnumValue;

	public class EnumBaseTest extends TestCase
	{
		public function EnumBaseTest(methodName:String=null)
		{
			super(methodName);
		}
		
		public static function suite():TestSuite {
   			var ts:TestSuite = new TestSuite();
   			
   			ts.addTest( new EnumBaseTest( "testEnum" ) );
   			ts.addTest( new EnumBaseTest( "testCompare" ) );
   			ts.addTest( new EnumBaseTest( "testLiterals" ) );
   			ts.addTest( new EnumBaseTest( "testNames" ) );
   			ts.addTest( new EnumBaseTest( "testValues" ) );
   			ts.addTest( new EnumBaseTest( "testSelectedIndex" ) );
   			return ts;
   		}
   		
   		public function testEnum():void {
   			var e:EnumSample;
   			
   			// Recherche de toutes les valeurs 
   			e = EnumSample.fromString("valeur0");
   			Assert.assertEquals(EnumSample.TYPE_0, e);
   			
   			// Recherche de toutes les valeurs 
   			e = EnumSample.fromString("valeur1");
			Assert.assertEquals(EnumSample.TYPE_1, e);
   			
   			// Recherche de toutes les valeurs 
   			e = EnumSample.fromString("valeur2");
   			assertEquals(EnumSample.TYPE_2, e);
   			
   			// Une valeur qui n'existe pas
   			try {
   				e = EnumSample.fromString("n'existe pas");
				Assert.fail("On ne devrait pas pouvoir affecter un Enum avec une valeur fausse");
   			}
   			catch (err:ErrorIllegalEnumValue) {
   				// C'est normal
   			}
   			catch (e:Error) {
				Assert.fail("On attendait une ErrorIllegalEnumValue");
   			}
   		}
   		
   		public function testCompare():void {
   			var e:EnumSample = EnumSample.TYPE_0;
   			var eBis:EnumSample = EnumSample.fromString("valeur0");
   			
			Assert.assertEquals(e, eBis);
   		}
   		
   		public function testLiterals():void {
   			var literals:Array = EnumSample.literals;
			Assert.assertEquals(3, literals.length);
   			
			Assert.assertEquals(EnumSample.TYPE_0.value, literals[0]);
			Assert.assertEquals(EnumSample.TYPE_1.value, literals[1]);
			Assert.assertEquals(EnumSample.TYPE_2.value, literals[2]);
   		}
   		
   		public function testNames():void {
   			var names:Array = EnumSample.names;
			Assert.assertEquals(3, names.length);
   			
			Assert.assertEquals("TYPE_0", names[0]);
			Assert.assertEquals("TYPE_1", names[1]);
			Assert.assertEquals("TYPE_2", names[2]);
   		}
   		
   		public function testValues():void {
   			var values:Array = EnumSample.values;
			Assert.assertEquals(3, values.length);
   			
			Assert.assertEquals(EnumSample.TYPE_0, values[0]);
			Assert.assertEquals(EnumSample.TYPE_1, values[1]);
			Assert.assertEquals(EnumSample.TYPE_2, values[2]);
   		}
   		
   		public function testSelectedIndex():void {
			Assert.assertEquals(0, EnumSample.TYPE_0.selectedIndex);
			Assert.assertEquals(1, EnumSample.TYPE_1.selectedIndex);
			Assert.assertEquals(2, EnumSample.TYPE_2.selectedIndex);
   			
   			var e:EnumSample = new EnumSample("n'existe pas");
			Assert.assertEquals(-1, e.selectedIndex);
   		}
	}
}